#!/bin/bash
#############################################################
#  功能描述: 机构柜台系统初始化完成标志检测
#  作　　者: chenhuan
#  设计日期: 20221021
#  版　　权: 西南证券
#  修改记录: 修改者      修改时间        修改内容
#
#############################################################

########################公共函数##############################
# 自定义 usage() 函数, 实现帮助文档
usage() {
    cat <<EOF
Description

    This is a help document.

Usage:

    $0 -d <业务日期> -f <执行频率> -t <完成延时>

Option:

    -d *必需, 请输入业务日期. 例如: 20220819
        说明:
            日期格式为[YYYYMMDD]
    
    -f *必需, 请输入执行频率(分钟). 例如: 1

    -t *必需, 请输入完成延时(分钟),即机构柜台系统初始化后等待时间. 例如: 30

    -h 查看帮助文档.
EOF
    exit 10
}

# 定义日志记录函数
logger() {
    echo -e $(date +%Y/%m/%d\ %H:%M:%S) : ${0##.*/} "[${1}]"- "${2}"
}

########################参数检查与处理##############################
while getopts "d:f:t:h:" OPTS; do
    case ${OPTS} in
    d)
        IN_TRADE_DATE="${OPTARG}"
        ;;
    f)
        EXEC_FREQUENCY="${OPTARG}"
        ;;
    t)
        SUCCESS_DELAY="${OPTARG}"
        ;;
    h)
        usage
        ;;
    ?)
        logger "ERROR" "${OPTS} 该参数不存在"
        usage
        ;;
    esac
done

if [ x${IN_TRADE_DATE} = x ]; then
    logger "ERROR" "[-d] - 业务日期参数不能为空"
    usage
elif ! [ $(expr match ${IN_TRADE_DATE} "[1-3][0-9][0-9][0-9][0-1][0-9][0-3][0-9]") = 8 ]; then
    logger "ERROR" "[-d] - 业务日期参数格式错误"
    usage
elif [ x${EXEC_FREQUENCY} = x ]; then
    logger "ERROR" "[-f] - 执行频率参数不能为空"
    usage
elif [ x${SUCCESS_DELAY} = x ]; then
    logger "ERROR" "[-t] - 完成延时参数不能为空"
    usage
fi

########################设置环境变量##############################
export LANG=zh_CN.UTF8
export HADOOP_USER_NAME=swscdc
source /usr/local/dolphinscheduler/TDH-Client/init.sh

########################获取大于当前业务日期的最小交易日##############################
logger "INFO" "[Begin] - 开始执行UF20柜台系统初始化标志位检测"
logger "INFO" "[Inceptor] - 从交易日维表[dim.dim_trade_date_add_year]获取大于当前业务日期的最小交易日"
INCEPTOR_SQL="SELECT MIN(dtd.date) FROM dim.dim_trade_date_add_year dtd WHERE dtd.MKT_CODE = '1' AND dtd.is_trade_date = '1' AND dtd.date > ${IN_TRADE_DATE};"
INCEPTOR_INFO=$(beeline -u "jdbc:inceptor2://10.150.28.93:10000/ods" -n swscdc -p Swsc600369 -e "${INCEPTOR_SQL}" --showHeader=false --silent=true)
INCEPTOR_RESULT=$(echo "${INCEPTOR_INFO}" | awk -F "|" '{print $2}' | sed ':a;N;$!ba;s/\n//g' | sed s/[[:space:]]//g)
logger "INFO" "[Inceptor] - 获取查询结果,交易日=${INCEPTOR_RESULT}"
if ! [ $(expr match ${INCEPTOR_RESULT} "[1-3][0-9][0-9][0-9][0-1][0-9][0-3][0-9]") = 8 ]; then
    logger "ERROR" "[交易日校验] - 日期格式错误"
    exit 10
fi

logger "INFO" "[UF20-222] - 从[HS_USER.SYSARG]表中查询交易日[${INCEPTOR_RESULT}]初始化标志"
########################执行初始化标志检测##############################
#周一到周四，UF20初始化时间在21点到22点30分之间
#周五的初始化时间如果有测试，则是在周日的下午17点10分的时候初始化完成
SQL_ERROR_COUNT=0
while true; do
    CHECK_RESULT=$(
        /usr/local/dolphinscheduler/oracle_client/instantclient_19_14/sqlplus -s sjzx/sjzx123@10.150.17.222:1521/ibmdxglk <<END
set pagesize 0 feedback off verify off heading off echo off;
SELECT COUNT(*) FROM DUAL WHERE EXISTS (SELECT 1 FROM HS_USER.SYSARG A WHERE A.INIT_DATE = ${INCEPTOR_RESULT} AND A.SYS_STATUS IN ('1'));
exit;
END
    )
    logger "INFO" "[Org] - 获取查询结果=${CHECK_RESULT}"
    if [ ${CHECK_RESULT} == 1 ]; then
        logger "INFO" "[Runing] - 已检测到UF20柜台系统初始化完成标志"
        logger "INFO" "[Runing] - 任务将等待${SUCCESS_DELAY}分钟后退出"
        sleep ${SUCCESS_DELAY}m
        logger "INFO" "[End] - 任务执行完成"
        exit 0
    elif [ ${CHECK_RESULT} == 0 ]; then
        logger "INFO" "[Runing] - 未检测到UF20柜台系统初始化完成标志"
        logger "INFO" "[Runing] - 任务将再${EXEC_FREQUENCY}分钟后继续检测"
        sleep ${EXEC_FREQUENCY}m
        continue
    else
        logger "ERROR" "[uf20-228] - sql执行错误, 获取UF20柜台系统初始化标志出错"
        if [ ${SQL_ERROR_COUNT} -ge 3 ]; then
            logger "ERROR" "[uf20-228] - sql执行错误次数超过3次, 即将退出初始化标志位检测程序"
            exit 20
        fi
        SQL_ERROR_COUNT=`expr ${SQL_ERROR_COUNT} + 1`
        logger "INFO" "[Runing] - SQL_ERROR_COUNT=${SQL_ERROR_COUNT}"
        sleep ${EXEC_FREQUENCY}m
        continue
    fi
done